package easier.fast.service.observer;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import androidx.lifecycle.Lifecycle;
import easier.fast.base.BaseActivity;
import io.reactivex.rxjava3.disposables.Disposable;

/**
 * 观察者,订阅时显示进度条,可以配置是否显示{@link #configSubscribeShowProgress()},
 * 如果设置了观察标记,那么订阅时会检查,如果正在请求中那么会关闭观察,
 * 如果有异常{@link #onError(Throwable)}先进行通用异常检查,如果没有处理那么交给用户自己处理
 *
 * @param <T>
 */
public class BaseProgressLifeObserver< T > extends BaseLifeObserver< T > {

    /**
     * 订阅时临时设置为点击事件
     */
    private static final OnClickListener LISTENER = new OnClickListener() {
        @Override
        public void onClick( View v ) {

            Toast.makeText( v.getContext(), "正在请求中...", Toast.LENGTH_SHORT ).show();
        }
    };

    private final View mView;
    private final OnClickListener mClickListener;

    public BaseProgressLifeObserver( View view, OnClickListener click, Lifecycle lifecycle ) {

        super( view.getContext(), lifecycle );

        mView = view;
        mClickListener = click;
    }

    @Override
    public void onSubscribe( Disposable d ) {

        super.onSubscribe( d );

        /* 防止多次点击 */
        mView.setOnClickListener( LISTENER );

        /* 配置是否显示进度条 */
        if ( configSubscribeShowProgress() ) {
            showProgress( mContext );
        }
    }

    /**
     * 该方法用于配置在订阅时是否显示进度条,如果不需要在订阅时显示,那个配置为false,自己在需要的地方显示
     *
     * @return true:如果设置为true,{@link #onSubscribe(Disposable)}时显示进度条,否则不显示
     */
    protected boolean configSubscribeShowProgress() {

        return true;
    }

    @Override
    protected void notifyFinished() {

        super.notifyFinished();
        dismissProgress( mContext );
        mView.setOnClickListener( mClickListener );
    }

    /**
     * @param context 显示进度
     */
    private static void showProgress( Context context ) {

        if ( context instanceof BaseActivity ) {
            ((BaseActivity) context).showProgress();
        }
    }

    /**
     * @param context 隐藏进度
     */
    private static void dismissProgress( Context context ) {

        if ( context instanceof BaseActivity ) {
            ((BaseActivity) context).dismissProgress();
        }
    }
}
